package com.yehebl.orm.data.common;

import java.util.List;

import com.yehebl.orm.data.common.dto.Page;
import com.yehebl.orm.data.common.dto.ResultObject;
import com.yehebl.orm.data.common.dto.SimplePage;
import com.yehebl.orm.data.lambda.PropertyFun;


/**
 * sql 拼接类
 */
public interface ISqlBuild {

    /**
     * @param clazz 查询的实体类
     * @param alias 类别名
     */
    <T> ISqlBuild select(Class<T> clazz, String alias);


    /**
     * 查询单类
     *
     * @param clazz 查询的实体类
     */
    <T> ISqlBuild select(Class<T> clazz);

    /**
     * @param clazz      查询的实体类
     * @param alias      类别名
     * @param objectName 返回的实体的对象属性名，单对象不使用
     */
    <T> ISqlBuild select(Class<T> clazz, String alias, String objectName);


    /**
     * 拼接任何sql
     *
     * @param sql sql
     */
    ISqlBuild join(String sql);

    /**
     * 条件为true 拼接任何sql
     *
     * @param sql sql
     */
    ISqlBuild trueJoin(boolean flag, String sql);


    /**
     * 查询单类
     *
     * @param clazz 查询的实体类
     */
    <T> T get(Class<T> clazz);


    /**
     * 查询列表
     *
     * @param clazz 查询的实体类
     */
    <T> List<T> find(Class<T> clazz);


    /**
     * 查询单个值
     */
    Object get();


    /**
     * 查询单个值
     */
    ResultObject getResultObjectBySql();


    /**
     * 分页查询
     *
     * @param page 页码 1开始
     * @param size 查询条数
     * @param clazz 查询的实体类
     */
    <T> Page<T> findPageBySql(int page, int size, Class<T> clazz);


    /**
     *
     * @param page 页码 1开始
     * @param size 查询条数
     * @param clazz 查询的实体类
     * @param pageType  null或1 查询分页和数据,2:数据,3:分页
     */
    <T> Page<T> findPageBySql(int page, int size, int pageType, Class<T> clazz);

    /**
     * 分页查询
     *
     * @param page 页码 1开始
     * @param size 查询条数
     * @param clazz 查询的实体类
     */
    <T> SimplePage<T> findSimplePageBySql(int page, int size, Class<T> clazz);


    <T> ISqlBuild where(String sql);


    <T> ISqlBuild on(String sql);


    <T> ISqlBuild inner(Class<T> clazz, String alias);


    <T> ISqlBuild right(Class<T> clazz, String alias);


    <T> ISqlBuild left(Class<T> clazz, String alias);


    <T> ISqlBuild from(Class<T> clazz);


    <T, R> ISqlBuild select(Class<T> clazz, String alias, PropertyFun<T, R> column);

    <T> ISqlBuild from(Class<T> clazz, String alias);


    <T> ISqlBuild where(String sql, Object... objs);


    ISqlBuild join(String sql, Object... objs);


    ISqlBuild trueJoin(boolean flag, String sql, Object... objs);


    /**
     * 拼接in的sql
     *
     * @param flag true 则拼接
     * @param sql sql语句
     * @param objs 参数
     */
    ISqlBuild trueJoinIn(boolean flag, String sql, Object... objs);


    ISqlBuild joinIn(String sql, Object... objs);


}
